//
//  DataBaseHandle.m
//  UI18_SQLite数据库
//
//  Created by dllo on 15/8/5.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import "DataBaseHandle.h"
#import <sqlite3.h>
#import "CollectModel.h"
@implementation DataBaseHandle


#pragma mark - 单例

/* 创建单例方法
 * 注意是类方法
 */
+ (instancetype)shareDataBaseHandle
{
    /* static 修饰词作用， 1. 在静态区开空间， 程序退出时，内存才释放
                         2. 只初始化一次。
     */
    static DataBaseHandle *databaseHandle = nil;
    
    if (databaseHandle == nil) {
        databaseHandle = [[DataBaseHandle alloc] init];
        
    }
    return databaseHandle;
}



#pragma mark - 数据库相关操作

static sqlite3 *db;

/* 打开数据库 */
- (void)open
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    
    /* 数据库文件路径 */
    NSString *sqlPath = [docPath stringByAppendingPathComponent:@"collect.sqlite"];
    
    /* 如果数据库已经打开，直接返回, 不运行下面代码 */
    if (db != nil) {
        NSLog(@"数据库已经打开");
        return;
    }
    
    /* 核心API sqlite3_open 函数*/
   int result = sqlite3_open(sqlPath.UTF8String, &db);
    
   /* 根据函数返回值，判断操作是否正确 */
    if (result == SQLITE_OK) {
        NSLog(@"数据库打开成功");
        
    }else{
    
        NSLog(@"数据库打开失败");
    }
}



/* 创建表单 */
- (void)createTable
{
    /* 创建SQL语句 */
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS Collect(number integer PRIMARY KEY AUTOINCREMENT, title TEXT, url TEXT)";
    
    /* 核心API: sqlite3_exec 函数 */
    int result = sqlite3_exec(db, createSQL.UTF8String, NULL, NULL, nil);
    
    if (SQLITE_OK == result)
    {
        NSLog(@"创建表格成功");
    }
    else
    {
        NSLog(@"创建表格失败");
    }
    
}



/* 插入数据(收藏信息) */
- (void)insertCollert:(CollectModel *)collect
{
    /* 创建SQL 语句 */
    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO collect(title, url) VALUES ('%@', '%@')", collect.title, collect.url];
    
     /* 核心API： */
   int result = sqlite3_exec(db, insertSQL.UTF8String, NULL, NULL, nil);

    if (SQLITE_OK == result) {
        NSLog(@"插入数据成功");
    }else{
        NSLog(@"插入数据失败");
    
    }
}







/* 删除数据 */
- (void)deleteCollect:(NSString *)title
{
    NSString *deletSQL = [NSString stringWithFormat:@"DELETE FROM collect WHERE title = '%@'", title];
    
    /* 核心API */
    int result = sqlite3_exec(db, deletSQL.UTF8String, NULL, NULL, nil);
    
    if (SQLITE_OK == result) {
        NSLog(@"删除数据成功");
    }else{
        NSLog(@"删除数据失败");
    
    }
}



/* 关闭数据库 */
- (void)close
{
   int result = sqlite3_close(db);
    
    if (SQLITE_OK == result) {
        db = nil;
        NSLog(@"关闭数据库成功");
    }else{
        NSLog(@"关闭数据库失败");
    }

}







/* 查询收藏信息 */
- (NSArray *)selectCollect
{
    
   /* 创建数组， 存放符合查询条件的对象 */
    NSMutableArray *array = [NSMutableArray array];
    
    /* 创建 SQL 查询语句 */
    NSString *selectSQL  = @"SELECT * FROM collect";
    
    /* 核心API */
    
    /* 准备好的 SQL 语句对象 */
    sqlite3_stmt *stmt = nil;
    
    /* 编译SQL 语句 */
   int result = sqlite3_prepare_v2(db, selectSQL.UTF8String, -1, &stmt, nil);
    if (SQLITE_OK == result) {
        
        NSLog(@"查询成功");

        /* sqlite3_step(stmt);
                            执行SQL 语句
         *  此函数的返回值为SQLIE_ROW时， 说明还有 row（行）可以查询
         */
                
        /* 循环体 */
        while (SQLITE_ROW == sqlite3_step(stmt)) {
            
            /* 当需要对查询之后的结果进行操作时，使用 sqlite3_column_ 函数族 */
           const unsigned char *title = sqlite3_column_text(stmt, 1); /* 取出title */
            
            const unsigned char *url = sqlite3_column_text(stmt, 2); /* 取出url */
            
            /* 创建MOdel 对象， 赋值 */
            CollectModel *collect = [[CollectModel alloc] init];
            collect.title = [NSString stringWithUTF8String:(const char *)title];
            collect.url = [NSString stringWithUTF8String:(const char *)url];


            /* model 对象添加数组中 */
            [array addObject:collect];

            

        }
        
        /* 销毁  准备好的 SQL 语句对象 */
        sqlite3_finalize(stmt);
        
    }else{
        NSLog(@"查询失败");
        
        /* 销毁  准备好的 SQL 语句对象 */
        sqlite3_finalize(stmt);
    }
    
    return array;
}



- (void)deleteCollection:(NSInteger)number
{
    NSString *sql = [NSString stringWithFormat:@"DELETE FROM collections WHERE number = %ld",number];
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
    if (result == SQLITE_OK) {
        //        NSLog(@"删除成功");
    }else {
        //        NSLog(@"删除失败");
    }
}



@end
